package nio;

import java.nio.ByteBuffer;

/**
 * @author Cheng Jun
 * Description: 深入理解 buffer的 position limit capacity mark
 * @version 1.0
 * @date 2022/8/16 11:32
 */
public class BufferExample {

    public static void main(String[] args) {

        // 创建一个缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        // 初始时4个核心变量的值
        System.out.println("初始时-->capacity--->" + byteBuffer.capacity());
        System.out.println("初始时-->limit--->" + byteBuffer.limit());
        System.out.println("初始时-->position--->" + byteBuffer.position());
        System.out.println("初始时-->mark--->" + byteBuffer.mark());
        System.out.println("--------------------------------------");

        // 添加一些数据到缓冲区中
        String name = "cauchy";
        byteBuffer.put(name.getBytes());
        // put后，4个核心变量的值
        System.out.println("put完之后-->capacity--->" + byteBuffer.capacity());
        System.out.println("put完之后-->limit--->" + byteBuffer.limit());
        System.out.println("put完之后-->position--->" + byteBuffer.position());
        System.out.println("put完之后-->mark--->" + byteBuffer.mark());
        System.out.println("--------------------------------------");

        // 当调用完 flip()时：limit是限制读到哪里，而position是从哪里读。一般我们称 flip()为“切换成读模式”
        byteBuffer.flip();
        System.out.println("flip之后-->capacity--->" + byteBuffer.capacity());
        System.out.println("flip之后-->limit--->" + byteBuffer.limit());
        System.out.println("flip之后-->position--->" + byteBuffer.position());
        System.out.println("flip之后-->mark--->" + byteBuffer.mark());
        System.out.println("--------------------------------------");

        // 读完我们还想写数据到缓冲区，那就使用clear()函数，这个函数会“清空”缓冲区：数据没有真正被清空，只是被遗忘掉了
        // 四个参数回到初始化是的值，但是数据并没有被清空。后续操作会覆盖掉数据
        byteBuffer.clear();
        System.out.println("clear之后-->capacity--->" + byteBuffer.capacity());
        System.out.println("clear之后-->limit--->" + byteBuffer.limit());
        System.out.println("clear之后-->position--->" + byteBuffer.position());
        System.out.println("clear之后-->mark--->" + byteBuffer.mark());
        System.out.println("--------------------------------------");
    }
}
